﻿using System;
using System.Collections.Generic;
using System.Data;
using System.Linq;
using System.Text;
using System.Threading.Tasks;
using Classes.Banco;
using System.Windows.Forms;

namespace Classes.Administrativo
{
    public class clsMenu: clsBanco
    {
        /// <summary>
        /// carrega o treeview com os niveis
        /// base de niveis 4 para o menu atual.
        /// </summary>
        /// <param name="trv">objeto treeview</param>
        /// <param name="dt">informações do menu no banoc</param>
        /// <param name="Menu">variavel bool que define se é uma chamada do menu ou outro aplicativo</param>
        public void Popula_TreeMenu(TreeView trv, DataTable dt, bool Menu)
        {
            int nivel = 0;
            string cod, desc;

            try
            {
                //int ii = 0;
                if (dt.Rows.Count > 0 && dt != null) //Tratamento do Datatable
                {
                    int num_linhas = dt.Rows.Count;//pega o numero de registros do banco 

                    //insere na base da tree 
                    trv.Nodes.Add(dt.Rows[0]["Mnu_Nivel1"].ToString(), (!Menu ? (dt.Rows[0]["Mnu_Nivel1"].ToString()
                                    + " ") : "")
                                  + dt.Rows[0]["Mnu_Descricao"].ToString());

                    if (!Menu)
                    {
                        TreeNode node = trv.Nodes[dt.Rows[0]["Mnu_Nivel1"].ToString()];
                        node.Checked = Convert.ToBoolean(dt.Rows[0][7]);
                        node = null;
                    }

                    for (int i = 1; i <= num_linhas - 1; i++)//roda cada linha da tabela
                    {
                        cod = dt.Rows[i]["Mnu_Nivel1"].ToString();
                        ///verifica se não esta em um filho do menu grupo 
                        if (Convert.ToInt32(dt.Rows[i]["Mnu_Nivel2"]) > 0)
                        {
                            cod += "|" + dt.Rows[i]["Mnu_Nivel2"].ToString();
                        }
                        if (Convert.ToInt32(dt.Rows[i]["Mnu_Nivel3"]) > 0)
                        {
                            cod += "|" + dt.Rows[i]["Mnu_Nivel3"].ToString();
                        }
                        desc = dt.Rows[i]["Mnu_Descricao"].ToString();//pega a desc
                        nivel = Classes.Util.clsUtil.conta_ocorrencias('|', cod);
                        TreeNode node = trv.Nodes[dt.Rows[i]["Mnu_Nivel1"].ToString()];
                        //if (cod == "12.2.10")
                        //    ii = 0;
                        switch (nivel)
                        {
                            //case 1:
                            //    node.Nodes.Add(cod, desc);
                            //    break;
                            case 2:
                                //caminha um nivel dentro do principal
                                node = node.Nodes[cod.Substring(0, cod.LastIndexOf('|'))];
                                //node.Nodes.Add(cod, desc);
                                break;
                            case 3:
                                //caminha 2 niveis dentro do principal
                                node = node.Nodes[(cod.Substring(0, cod.LastIndexOf('|') - (cod.Split('|')[2].Length + 1)))];
                                //caminha um nivel dentro do principal
                                node = node.Nodes[cod.Substring(0, cod.LastIndexOf('|'))];
                                //node.Nodes.Add(cod, desc);
                                break;
                            case 4:
                                //node = node.Nodes[cod.Substring(0, cod.LastIndexOf('.') - 4)]; 

                                node = node.Nodes[(cod.Substring(0, cod.LastIndexOf('|') - (cod.Split('|')[2].Length + 3)))];
                                node = node.Nodes[(cod.Substring(0, cod.LastIndexOf('|') - (cod.Split('|')[2].Length + 1)))];
                                node = node.Nodes[cod.Substring(0, cod.LastIndexOf('|'))];
                                //node.Nodes.Add(cod, desc);

                                break;
                        }

                        node.Nodes.Add(cod, (Menu ? desc : cod + " " + desc), 14, 14);
                        if (!Menu)
                            node.Nodes[cod].Checked = Convert.ToBoolean(dt.Rows[i][7]);
                    }
                }
            }
            catch (Exception ex)
            {
                throw ex;
            }
        }

        /// <summary>
        /// carrega o treeview com os niveis
        /// base de niveis 4 para o menu atual.
        /// </summary>
        /// <param name="trv">objeto treeview</param>
        /// <param name="dt">informações do menu no banoc</param>
        /// <param name="Menu">variavel bool que define se é uma chamada do menu ou outro aplicativo</param>
        public void Popula_TreeMenu2(TreeView trv, DataTable dt, bool Menu)
        {
            int nivel = 0;
            string cod, desc;
            int Grupo = 0;

            try
            {
                TreeNode node;
                for (int i = 0; i <= dt.Rows.Count - 1; i++)//roda cada linha da tabela
                {
                    if (Convert.ToInt32(dt.Rows[i]["Mnu_Nivel1"]) > Grupo)
                    {
                        Grupo = Convert.ToInt32(dt.Rows[i]["Mnu_Nivel1"]);
                        trv.Nodes.Add(dt.Rows[i]["Mnu_Nivel1"].ToString(), (!Menu ? (dt.Rows[i]["Mnu_Nivel1"].ToString()
                                    + " ") : "")
                                  + dt.Rows[i]["Mnu_Descricao"].ToString());

                        if (!Menu)
                        {
                            node = trv.Nodes[dt.Rows[0]["Mnu_Nivel1"].ToString()];
                            node.Checked = Convert.ToBoolean(dt.Rows[0][7]);
                            node = null;
                        }
                    }
                    else
                    {
                        cod = dt.Rows[i]["Mnu_Nivel1"].ToString();
                        ///verifica se não esta em um filho do menu grupo 
                        if (Convert.ToInt32(dt.Rows[i]["Mnu_Nivel2"]) > 0)
                        {
                            cod += "|" + dt.Rows[i]["Mnu_Nivel2"].ToString();
                        }
                        if (Convert.ToInt32(dt.Rows[i]["Mnu_Nivel3"]) > 0)
                        {
                            cod += "|" + dt.Rows[i]["Mnu_Nivel3"].ToString();
                        }
                        desc = dt.Rows[i]["Mnu_Descricao"].ToString();//pega a desc
                        nivel = Classes.Util.clsUtil.conta_ocorrencias('|', cod);
                        node = trv.Nodes[dt.Rows[i]["Mnu_Nivel1"].ToString()];
                        //if (cod == "12.2.10")
                        //    ii = 0;
                        switch (nivel)
                        {
                            //case 1:
                            //    node.Nodes.Add(cod, desc);
                            //    break;
                            case 2:
                                //caminha um nivel dentro do principal
                                node = node.Nodes[cod.Substring(0, cod.LastIndexOf('|'))];
                                //node.Nodes.Add(cod, desc);
                                break;
                            case 3:
                                //caminha 2 niveis dentro do principal
                                node = node.Nodes[(cod.Substring(0, cod.LastIndexOf('|') - (cod.Split('|')[2].Length + 1)))];
                                //caminha um nivel dentro do principal
                                node = node.Nodes[cod.Substring(0, cod.LastIndexOf('|'))];
                                //node.Nodes.Add(cod, desc);
                                break;
                            case 4:
                                //node = node.Nodes[cod.Substring(0, cod.LastIndexOf('.') - 4)]; 

                                node = node.Nodes[(cod.Substring(0, cod.LastIndexOf('|') - (cod.Split('|')[2].Length + 3)))];
                                node = node.Nodes[(cod.Substring(0, cod.LastIndexOf('|') - (cod.Split('|')[2].Length + 1)))];
                                node = node.Nodes[cod.Substring(0, cod.LastIndexOf('|'))];
                                //node.Nodes.Add(cod, desc);

                                break;
                        }

                        node.Nodes.Add(cod, (Menu ? desc : cod + " " + desc), 14, 14);
                        if (!Menu)
                            node.Nodes[cod].Checked = Convert.ToBoolean(dt.Rows[i][7]);
                    }
                }
            }
            catch (Exception ex)
            {
                throw ex;
            }
        }

        public DataTable RetornaNomeForm(string nome)
        {
            try
            {
                Sql.Parameters.Clear();
                Sql.CommandText = @"SELECT * FROM MENU WHERE MNU_DESCRICAO = @DESCRICAO";
                Sql.Parameters.Add("@DESCRICAO", nome);

                return RetornaDados();
            }
            catch (Exception ex)
            {
                throw ex;
            }
        }
        
    }
}